"""


"""
from flask import current_app, jsonify
from flask import request
from flask import session

from info import constants
from info import redis_store
from info.models import User, News, Category
from info.utils.response_code import RET
from . import index_blu
from flask import render_template


# 用蓝图对象装饰视图函数
@index_blu.route("/")
def index():

    # 1、先获取用户的登录信息
    # 1.1 拿数据session的user_id
    user_id = session.get("user_id")
    # 1.2查询数据库 为了拿到用户的相关数据
    user = None
    try:
        user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)

    # 点击排行的数据展示
    # 查询数据库， 查询News
    try:
        news_click = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询错误")

    # 首页导航部分的分类数据展示
    # 查询数据库， 查询Category
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询错误")


    # 把数据传给前端
    data = {
        "user_info": user.to_dict() if user else None, # user.to_dict() 可以通过它获取到用户的信息
        "news_click": news_click,
        "categories": categories
    }

    return render_template("news/index.html", data=data)


# 浏览器在请求页面的时候会自动发起一个GET请求 /favicon.ico，为了显示小图标
# 所以我们要做一个视图函数来处理这个请求
# 我们视图函数的工作是要返回这个文件给浏览器
# flask中提供了一个方法send_static_file("相对于static的文件路径")，自动寻找static目录下的文件
# 这个方法是app的，我们通过current_app来调用
@index_blu.route("/favicon.ico")
def get_icon():
    return current_app.send_static_file("news/favicon.ico")


@index_blu.route("/news_list")
def news_list():
    """
        处理  首页展示新闻列表数据  的请求

        1、获取参数， 注意请求方式是GET
        2、查询数据库 News  通过 paginate()  按照创建时间降序排列
        3、返回新闻列表数据给前端
    """

    # 1、获取参数， 注意请求方式是GET
    data_dict = request.args
    page = data_dict.get("page", 1)   # 当前页数
    cid = data_dict.get("cid", 1)   # 请求的新闻的所属分类的id
    per_page = data_dict.get("per_page", 5)  # 每页多少条
    try:
        page = int(page)
        cid = int(cid)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg="参数错误")

    # 2、查询数据库 News  通过paginate()  按照创建时间降序排列
    filters = [News.status == 0]
    if cid != 1:
        filters.append(News.category_id == cid)   # 为了区分最新，和其他分类
    print(filters)
    try:
        # *filters 拆包
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)

        news_list_curpage = paginate.items   # 当前页的数据  查出来的数据是模型对象列表
        total_page= paginate.pages   # 总页数
        current_page= paginate.page   # 当前页码
    except Exception as e:
        current_app.logger.error(e)

    # 把每一个里表中的模型对象转换成字典, 是为了js代码能够识别到这些数据(js代码不认识python模型对象)
    newsList = []
    for i in news_list_curpage:
        newsList.append(i.to_basic_dict())

    # 3、返回新闻列表数据给前端
    return jsonify(errno=RET.OK, errmsg="OK", newsList=newsList, totalPage=total_page, currentPage=current_page)

